import { changeCount, getCartList, delSelect } from '@/api/cart'
import { Toast } from 'vant'

export default {
  namespaced: true, // 开启命名空间
  // 分模块
  state () {
    // 状态
    return {
      cartList: []

    }
  },
  mutations: {
    // 同步封装
    // 提供一个设置 cartList的 mutations方法
    setCartList (state, newList) {
      state.cartList = newList
    },
    toggleCheck (state, goodsId) {
      // 让对应的 id 的项 状态取反(
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      // 让其对自己的状态取反
      goods.isChecked = !goods.isChecked
    },
    toggleAllCheck (state, flag) {
      // 让所有的小选框，同步设置
      state.cartList.forEach(item => {
        item.isChecked = flag
      })
    },
    // 本地同步
    changeCount (state, { goodsId, goodsNum }) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.goods_num = goodsNum
    }
  },
  actions: {
    // 异步封装
    async getCartAction (context) {
      // 调用封装的方法
      const { data } = await getCartList()

      // 后台返回的数据中，不包含复选框的选中状态，为了实现将来的功能
      // 需要手动维护数据，给每一项，添加一个 isChecked 属性（标记当前商品是否选中）
      data.list.forEach(item => {
        item.isChecked = true
      })

      // 将data.list 存起来，需要提供对应的mutations
      context.commit('setCartList', data.list)
    },
    // 页面中调用 getCartAction 就可以获取到对应的购物车列表，拿到列表就可以用mutations 往 state中cartList 中存数据
    async changeCountAction (context, obj) {
      const { goodsNum, goodsId, goodsSkuId } = obj
      // 本地进行修改，
      context.commit('changeCount', { goodsId, goodsNum })
      // 在同步到后台
      await changeCount(goodsId, goodsNum, goodsSkuId)
      // console.log(res)
    },
    // 提供一个删除actions,删除购物车数据
    async delSelect (context) {
      // 拿到购物车数组
      const seleCartList = context.getters.seleCartList
      // map 可以遍历数组处理数据，并且返回新的数组，有返回值
      const cartIds = seleCartList.map(item => item.id)
      // console.log(cartIds)
      await delSelect(cartIds)
      Toast('删除成功了')
      // 删除成功后，重新拉取最新的购物车数据
      context.dispatch('getCartAction')
    }
  },
  getters: {
    // 提供基于state所派生的方法
    cartTotal (state) {
      // 商品总数
      return state.cartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 提供一个选中的商品项
    seleCartList (state) {
      return state.cartList.filter(item => item.isChecked)
    },

    // 选中的总数
    seleCount (state, getters) {
      return getters.seleCartList.reduce((sum, item) => sum + item.goods_num, 0)
    },

    // 选中的总价
    selePrice (state, getters) {
      return getters.seleCartList.reduce((sum, item) => sum + item.goods_num * item.goods.goods_price_min, 0).toFixed(2)
    },

    // 是否全选
    isAllChecked (state) {
      return state.cartList.every(item => item.isChecked)
    }
  }
}
